//package com.example.onlinemusic.controller;
//
//import com.example.onlinemusic.mapper.UserMapper;
//import com.example.onlinemusic.model.User;
//import com.example.onlinemusic.tools.Constant;
//import com.example.onlinemusic.tools.ResponseBodyMessage;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.RestController;
//
//import javax.servlet.http.HttpServletRequest;
//
///**
// * Created with IntelliJ IDEA.
// * Description:
// * User: 74646
// * Date: 2022-08-21
// * Time: 18:36
// */
//@RestController
//@RequestMapping("/user")
//public class UserController {
//    @Autowired
//    private UserMapper userMapper;
//
//    @RequestMapping("/login")
//    // 传入用户名和密码
//    public ResponseBodyMessage<User> login(@RequestParam String username, @RequestParam String password, HttpServletRequest request){
//        // 设置登录对象（设置用户名和密码）
//        User userLogin = new User();
//        userLogin.setUsername(username);
//        userLogin.setPassword(password);
//
//        // 调用 UserMapper 接口
//       User user = userMapper.login(userLogin);
//
//       // 判断是否登录成功
//        if(user != null){
//            System.out.println("登录成功"); // 可以在控制台中打印登录信息
//            // 如果登录成功就将信息写入到 session 中（在 session 中存储了一个用户信息对象,此后可以随时从 session 中将这个对象取出来进行一些操作）
//            request.getSession().setAttribute(Constant.USERINFO,user);
//            return   new ResponseBodyMessage<>(200,"登录成功",userLogin); // 状态码为200,表示登录成功,并返回用户信息
//        }else{
//            System.out.println("登录失败");
//            return   new ResponseBodyMessage<>(500,"登录成功",userLogin); // 状态码为500,表示登录失败,并返回用户信息
//        }
//    }
//}
//


package com.example.onlinemusic.controller;

import com.example.onlinemusic.mapper.UserMapper;
import com.example.onlinemusic.model.User;
import com.example.onlinemusic.tools.Constant;
import com.example.onlinemusic.tools.ResponseBodyMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 74646
 * Date: 2022-08-21
 * Time: 18:36
 */

/**
 * @RestController：@ResponseBody ＋ @Controller合在一起的作用。@Controller注解，表明了这个类是一个控
 * 制器类 ，@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中 。
 *
 * @RequestMapping：使用 @RequestMapping 来映射请求，也就是通过它来指定控制器可以处理哪些URL请求
 *
 * @RequestParam：将请求参数绑定到你控制器的方法参数上 。
 * 如果这个参数是非必传的可以写为：@RequestParam(required = false) ，默认是true
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserMapper userMapper;

    // BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); // 通过创建的对象的方式

    /**
     * 注入的方式
     * @Autowired：可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在 setter 方法，构造函数，具有
     * 任意名称或多个参数的属性或方法上自动装配bean。默认情况下，它是类型驱动的注入
     */
    // 使用 BCrypt 对密码进行加密
    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @RequestMapping("/login")
    // 传入用户名和密码
    public ResponseBodyMessage<User> login(@RequestParam String username, @RequestParam String password, HttpServletRequest request){

        // 调用 UserMapper 接口
        User user = userMapper.selectByName(username);

        // 判断是否登录成功
        if(user != null){
            System.out.println("登录成功"); // 可以在控制台中打印登录信息

            // 判断当前用户输入的密码(password) 与 数据库中查询到的密码(加密的密码，getPassword())是否匹配
            boolean flag = bCryptPasswordEncoder.matches(password,user.getPassword());

            if(!flag){
                // 密码不匹配，登录失败
                return new ResponseBodyMessage<>(-200,"用户名或密码错误",user);
            }

            // 如果登录成功就将信息写入到 session 中（在 session 中存储了一个用户信息对象,此后可以随时从 session 中将这个对象取出来进行一些操作）
            request.getSession().setAttribute(Constant.USER_SESSION_KEY,user);
            // 状态码为200,表示登录成功,并返回用户信息
            return   new ResponseBodyMessage<>(200,"登录成功",user);
        }else{
            System.out.println("登录失败");
            // 状态码为-200,表示登录失败,并返回用户信息
            return   new ResponseBodyMessage<>(-200,"用户名或密码错误",user);
        }
    }


    /**
     * 用户注册
     * @param username
     * @param password
     * @return
     */
    @RequestMapping("/register")
    public ResponseBodyMessage<Boolean> register(@RequestParam String username,@RequestParam String password) {
        User user1 = userMapper.selectByName(username);
//        User user1 = userService.selectByName(user.getUsername());
        if(user1 != null) {
            return new ResponseBodyMessage<>(-1,"当前用户已经存在",false);
        }else {
            String newPassword = bCryptPasswordEncoder.encode(password);
            boolean flag = userMapper.insertInToValues(username,newPassword);
            if(flag == true){
                return new ResponseBodyMessage<>(200,"注册成功",true);
            }else{
                return new ResponseBodyMessage<>(-200,"注册失败",false);
            }
//            User newUser = new User();
//            newUser.setUsername(username);
//            newUser.setUsername(password);
//            newUser.setUsername(user.getUsername());
//            newUser.setPassword(newPassword);
//            userService.addnewUser(newUser);
        }
    }
}

